import 'package:dk_flutter_base/dk_core.dart';
import 'package:dk_flutter_base/dk_ui.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/services.dart';

class DkTextField extends TextField {
  DkTextField(DkTextFieldOption option)
      : super(
          key: option.key,
          controller: option.controller,
          focusNode: option.focusNode,
          decoration: option.decoration,
          keyboardType: option.keyboardType,
          textInputAction: option.textInputAction,
          textCapitalization: option.textCapitalization,
          style: option.style,
          strutStyle: option.strutStyle,
          textAlign: option.textAlign,
          textAlignVertical: option.textAlignVertical,
          textDirection: option.textDirection,
          readOnly: option.readOnly,
          showCursor: option.showCursor,
          autofocus: option.autofocus,
          obscureText: option.obscureText,
          autocorrect: option.autocorrect,
          maxLines: option.maxLines,
          minLines: option.minLines,
          expands: option.expands,
          maxLength: option.maxLength,
          maxLengthEnforced: option.maxLengthEnforced,
          onChanged: option.onChanged,
          onEditingComplete: option.onEditingComplete,
          onSubmitted: option.onSubmitted,
          inputFormatters: option.inputFormatters,
          enabled: option.enabled,
          cursorWidth: option.cursorWidth,
          cursorRadius: option.cursorRadius,
          cursorColor: option.cursorColor,
          keyboardAppearance: option.keyboardAppearance,
          scrollPadding: option.scrollPadding,
          dragStartBehavior: option.dragStartBehavior,
          enableInteractiveSelection: option.enableInteractiveSelection,
          onTap: option.onTap,
          buildCounter: option.buildCounter,
          scrollController: option.scrollController,
          scrollPhysics: option.scrollPhysics,
        );
}

///编辑框，封装
///参考-https://www.jianshu.com/p/f6b994fdb9fb
///参考-https://www.jianshu.com/p/4049ebf0a198
class DkTextFieldOption {
  Key key;

  ///控制正在编辑的文本。通过其可以拿到输入的文本值
  ///获取方式 String value=controller.text
  ///编辑框的控制器，通过它可以设置/获取编辑框的内容、选择编辑内容、监听编辑文本改变事件。
  ///大多数情况下我们都需要显式提供一个controller来与文本框交互。
  ///如果没有提供controller，则TextField内部会自动创建一个;
  TextEditingController controller;

  ///用于控制TextField是否占有当前键盘的输入焦点;
  FocusNode focusNode;

  ///用于控制TextField的外观显示，如提示文本、背景颜色、边框等;给TextField设置装饰（形状等）
  InputDecoration decoration = const InputDecoration();

  ///用于设置该输入框默认的键盘输入类型，可取值范围：
  ///1.text ： 文本输入键盘
  ///2.multiline ：多行文本
  ///3.number ： 数字
  ///4.phone :优化后的电话号码输入键盘,带有启用有符号和十进制模式的选项
  ///5.datetime :优化后的日期输入键盘,带有 “/” 和 “:” 符号
  ///6.emailAddress : 普通键盘，带有“@”符号
  TextInputType keyboardType;

  ///控制键盘的功能键 指enter键，比如此处设置为next时，enter键
  ///显示的文字内容为 下一步
  TextInputAction textInputAction;

  ///键盘大小写的显示 Only supports text keyboards  但是好像不起作用？
  ///characters 默认为每个字符使用大写键盘
  ///sentence 默认为每个句子的第一个字母使用大写键盘
  ///word 默认为每个单词的第一个字母使用大写键盘。
  ///none 默认使用小写
  TextCapitalization textCapitalization;

  ///正在编辑的文本样式;
  TextStyle style;

  StrutStyle strutStyle;

  ///输入框内编辑文本在水平方向的对齐方式;
  TextAlign textAlign = TextAlign.start;

  TextAlignVertical textAlignVertical;

  TextDirection textDirection;

  ///是否可编辑
  bool readOnly;

  bool showCursor;

  ///是否自动对焦
  bool autofocus;

  ///是否是密码,是否隐藏正在编辑的文本，如用于输入密码的场景等，文本内容会用“•”替换。
  bool obscureText;

  ///是否自动更正
  bool autocorrect;

  ///输入框的最大行数，默认为1；如果为null，则无行数限制;
  int maxLines;

  int minLines;

  bool expands;

  ///maxLength代表输入框文本的最大长度，设置后输入框右下角会显示输入的文本计数。
  ///maxLengthEnforced决定当输入文本长度超过maxLength时是否阻止输入，
  ///为true时会阻止输入，
  ///为false时不会阻止输入但输入框会变红;
  int maxLength;

  /// 跟最大长度限制对应，如果此属性设置为false,当输入超过最大长度
  /// 限制时，依然会显示输入的内容，为true不会（默认为 true）
  bool maxLengthEnforced;

  ///输入框内容改变时的回调函数；注：内容改变事件也可以通过controller来监听;
  ValueChanged<String> onChanged;

  ///onEditingComplete和onSubmitted：这两个回调都是在输入框输入完成时触发，
  ///比如按了键盘的完成键（对号图标）或搜索键（🔍图标）。
  ///不同的是两个回调签名不同，onSubmitted回调是ValueChanged<String>类型，它接收当前输入内容做为参数，
  ///而onEditingComplete不接收参数
  VoidCallback onEditingComplete;

  ///内容提交(按回车)的回调
  ValueChanged<String> onSubmitted;

  ///用于指定输入格式；当用户输入内容改变时，会根据指定的格式来校验;
  List<TextInputFormatter> inputFormatters;

  ///如果为false，则输入框会被禁用，禁用状态不接收输入和事件，同时显示禁用态样式（在其decoration中定义）
  bool enabled;

  ///cursorWidth、cursorRadius和cursorColor：这三个属性是用于自定义输入框光标宽度、圆角和颜色的。
  double cursorWidth;

  Radius cursorRadius;

  Color cursorColor;

  Brightness keyboardAppearance;

  EdgeInsets scrollPadding;

  DragStartBehavior dragStartBehavior = DragStartBehavior.start;

  bool enableInteractiveSelection;

  GestureTapCallback onTap;

  InputCounterWidgetBuilder buildCounter;

  ScrollController scrollController;

  ScrollPhysics scrollPhysics;

  DkTextFieldOption(
      {this.key,
      this.controller,
      this.focusNode,
      this.decoration,
      this.keyboardType,
      this.textInputAction,
      this.textCapitalization,
      this.style,
      this.strutStyle,
      this.textAlign,
      this.textAlignVertical,
      this.textDirection,
      this.readOnly,
      this.showCursor,
      this.autofocus,
      this.obscureText,
      this.autocorrect,
      this.maxLines = 1,
      this.minLines,
      this.expands,
      this.maxLength,
      this.maxLengthEnforced,
      this.onChanged,
      this.onEditingComplete,
      this.onSubmitted,
      this.inputFormatters,
      this.enabled,
      this.cursorWidth,
      this.cursorRadius,
      this.cursorColor,
      this.keyboardAppearance,
      this.scrollPadding,
      this.dragStartBehavior,
      this.enableInteractiveSelection,
      this.onTap,
      this.buildCounter,
      this.scrollController,
      this.scrollPhysics}) {
    textAlign ??= TextAlign.start;
    readOnly ??= false;
    autofocus ??= false;
    obscureText ??= false;
    autocorrect ??= true;
    expands ??= false;
    maxLengthEnforced ??= true;
    scrollPadding ??= EdgeInsets.all(20.0);
    cursorWidth ??= 2.0;
    dragStartBehavior ??= DragStartBehavior.start;
    enableInteractiveSelection ??= true;

    textCapitalization ??= TextCapitalization.none;
    if (null != maxLines && maxLines <= 0) {
      maxLines = 1;
    }
    if (null != minLines && minLines <= 0) {
      minLines = null;
    }
    if (null != maxLines && null != minLines && maxLines < minLines) {
      minLines = maxLines;
    }
    if (checkBool(expands)) {
      maxLines = null;
      minLines = null;
    }
    if (maxLength != null &&
        maxLength != TextField.noMaxLength &&
        maxLength <= 0) {
      maxLength = TextField.noMaxLength;
    }
  }
}
